/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package desk;

import ejb.ProductManager;
import hibernate.Product;
import hibernate.ProductCategory;
import java.util.*;
import javax.faces.application.FacesMessage;
import javax.faces.bean.*;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

/**
 * Бин управления продуктами и категориями (добавление/изменение/удаление)
 * @author AGolubinskyy
 */
@ManagedBean(name = "ub")
public class UtilsBean {
    @ManagedProperty(value="#{th}")
    private TabHolderBean tabHolderBean;
    @ManagedProperty(value = "#{webClientController}")
    private WebClientController clientController;
    private ProductManager productManager = null;
    private String categoryName, productName;
    private boolean productCommon;
    private int categoryID, productID;

    public String getCategoryName() {
        return categoryName;
    }

    public void setCategoryName(String categoryName) {
        this.categoryName = categoryName;
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public boolean isProductCommon() {
        return productCommon;
    }

    public void setProductCommon(boolean productCommon) {
        this.productCommon = productCommon;
    }

    public int getCategoryID() {
        return categoryID;
    }

    public void setCategoryID(int categoryID) {
        this.categoryID = categoryID;
    }

    public List<SelectItem> getCategories() {
        List<SelectItem> items = new ArrayList<SelectItem>();
        List<ProductCategory> cats = productManager.getAllCategories();
        if (cats != null) {
            for (ProductCategory pc : cats) {
                items.add(new SelectItem(pc.getId(), pc.getDescription()));
            }
        }
        return items;
    }

    /**
     * Создает категорию. Если создать нельзя, генерирует сообщение FacesMessage
     * @return
     */
    public String addCategory() {
        if(!productManager.saveNewCategory(categoryName)){
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Unable to create category with this name"));
        }
        init();
        return null;
    }

    /**
     * Создает продукт. Если создать нельзя, генерирует сообщение FacesMessage
     * @return
     */
    public String addProduct() {
        if(!productManager.saveNewProduct(productName, productManager.getCategoryByID(categoryID), productCommon)){
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Unable to create product with this name"));
        }
        init();
        return null;
    }

    /**
     * Переименовывает категорию. Если переименовать нельзя, генерирует сообщение FacesMessage
     * @return
     */
    public String editCategory() {
        ProductCategory c = productManager.getCategoryByID(categoryID);
        c.setDescription(categoryName);
        if (!productManager.updateCategory(c)){
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Unable to update this category"));
        }
        init();
        return null;
    }
    
    /**
     * Изменяет продукт. Если изменить нельзя, генерирует сообщение FacesMessage
     * @return
     */
    public String editProduct(){
        Product p = productManager.getProductByID(productID);
        p.setDescription(productName);
        p.setCommon(productCommon);
        if(!productManager.updateProduct(p)){
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Unable to update this product"));
        }
        init();
        return null;
    }
    
    /**
     * Удаляет категорию. Если удалить нельзя, генерирует сообщение FacesMessage
     * @return
     */
    public String deleteCategory(){
        
        //to be checked in logic layer 
        
        ProductCategory cat = productManager.getCategoryByID(categoryID);
        List<Product> prods = productManager.getAllProductsInCategory(categoryID);
        if (prods == null || prods.isEmpty()){
            productManager.deleteCategory(cat);
        } else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("This category isn't empty"));
        }
        init();
        return null;
    }
    
    /**
     * Удаляет продукт. Если удалить нельзя, генерирует сообщение FacesMessage
     * @return
     */
    public String deleteProduct(){
        
        //to be checked in logic layer 
        
        if (!productManager.deleteProduct(productManager.getProductByID(productID))){
             FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Unable to delete this product"));
        }
        init();
        return null;
    }

    public void setClientController(WebClientController clientController) {
        this.clientController = clientController;
        productManager = clientController.getServerManager().getProductManager();
    }

    public int getProductID() {
        return productID;
    }

    public void setProductID(int productID) {
        this.productID = productID;
    }

    public List<SelectItem> getProducts() {
        List<SelectItem> items = new ArrayList<SelectItem>();
        List<ProductCategory> cats = productManager.getAllCategories();
        if (cats != null) {
            for (ProductCategory c : cats) {
                items.add(new SelectItem(c.getId(), c.getDescription(), "Category description", true));
                List<Product> prods = productManager.getAllProductsInCategory(c.getId());
                if (prods != null) {
                    for (Product p : prods) {
                        items.add(new SelectItem(p.getId(), "&nbsp;&nbsp;&nbsp;" + p.getDescription(), "Product description", false, false));
                    }
                }
            }
        }
        return items;
    }
    
    private void init(){
        tabHolderBean.getTabView().setActiveIndex(2);
        categoryName ="";
        productName ="";
        productCommon=false;
        categoryID =-1;
        productID=-1;
    }

    public void setTabHolderBean(TabHolderBean tabHolderBean) {
        this.tabHolderBean = tabHolderBean;
    }
}
